// wgltransfo.cpp
//

#include "config.h"
#include "wgl/wgltransfo.hpp"

#include "glm/gtc/matrix_transform.hpp"
#include "glm/gtx/euler_angles.hpp"

using namespace wgl;



// Transfo::Transfo
//
Transfo::Transfo ()
{
}



// Transfo::Transfo
//
Transfo::Transfo ( glm::vec3 position,
                   glm::vec3 rotation,
                   glm::vec3 scale )
  : v_position(position),
    v_rotation(rotation),
    v_scale(scale)
{
}



// Transfo::get_matrix
//
const glm::mat4 &Transfo::get_matrix ()
{
  if (transfo_dirty)
    {
      m_transfo = glm::translate(glm::mat4{1.f}, v_position);
      m_transfo *= glm::orientate4(v_rotation);
      m_transfo = glm::scale(m_transfo, v_scale);
      transfo_dirty = false;
    }
  
  return m_transfo;
}



// Transfo::get_inverse
//
const glm::mat4 &Transfo::get_inverse ()
{
  if (inv_dirty)
    {
      m_inverse = glm::inverse(get_matrix());
      inv_dirty = false;
    }
  return m_inverse;
}



// Transfo::set_position
//
void Transfo::set_position ( glm::vec3 position )
{
  v_position = position;
  transfo_dirty = true;
  inv_dirty = true;
}



// Transfo::set_rotation
//
void Transfo::set_rotation ( glm::vec3 rotation )
{
  v_rotation = rotation;
  transfo_dirty = true;
  inv_dirty = true;
}



// Transfo::set_scale
//
void Transfo::set_scale ( glm::vec3 scale )
{
  v_scale = scale;
  transfo_dirty = true;
  inv_dirty = true;
}
